package bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

import bean.vo.ItemSolicitudCotizacionVO;
import bean.vo.SolicitudCotizacionVO;


@Entity 
@Table( name = "solicitudes_cotizacion" )
@SuppressWarnings({"unchecked"})
public class SolicitudCotizacion extends EntidadPersistente{
	private Integer numeroSolicitud;
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private OficinaDeVenta oficinaDeVenta;
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Cliente cliente;
	private Date fechaRecepcion;
	@OneToMany( cascade = CascadeType.ALL, mappedBy = "solicitud")
	private List<ItemSolicitudCotizacion> itemsSolicitud;
	private boolean cotizada;
	
	public SolicitudCotizacion () {
		this.itemsSolicitud = new ArrayList<ItemSolicitudCotizacion>();
	}
	
	public SolicitudCotizacion (Integer numeroSolicitud,Cliente cliente){
		this.numeroSolicitud = numeroSolicitud;
		this.cliente = cliente;
		this.itemsSolicitud = new ArrayList<ItemSolicitudCotizacion>();
	}
	
	public SolicitudCotizacion (Integer numeroSolicitud, OficinaDeVenta oficinaDeVenta, Cliente cliente, Date fechaRecepcion){
		this.numeroSolicitud = numeroSolicitud;
		this.oficinaDeVenta = oficinaDeVenta;
		this.cliente = cliente;
		this.fechaRecepcion = fechaRecepcion;
		this.itemsSolicitud = new ArrayList<ItemSolicitudCotizacion>();
	}
	
	public SolicitudCotizacionVO getVO() {
		SolicitudCotizacionVO vo = new SolicitudCotizacionVO();
		vo.setCliente(cliente != null ? cliente.getVO() : null);
		vo.setCotizada(cotizada);
		vo.setFechaRecepcion(fechaRecepcion);
		vo.setItemsSolicitud(new VOList<ItemSolicitudCotizacionVO>().getVoList(itemsSolicitud));
		vo.setNumeroSolicitud(numeroSolicitud);
		vo.setOficinaDeVenta(oficinaDeVenta != null ? oficinaDeVenta.getVO() : null);
		
		return vo;
	}
	
	public Integer getNumeroSolicitud() {
		return numeroSolicitud;
	}
	
	public void setNumeroSolicitud(Integer numeroSolicitud) {
		this.numeroSolicitud = numeroSolicitud;
	}
	
	public OficinaDeVenta getOficinaDeVenta() {
		return oficinaDeVenta;
	}
	
	public void setOficinaDeVenta(OficinaDeVenta oficinaDeVenta) {
		this.oficinaDeVenta = oficinaDeVenta;
	}
	
	public Cliente getCliente() {
		return cliente;
	}
	
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	
	public Date getFechaRecepcion() {
		return fechaRecepcion;
	}
	
	public void setFechaRecepcion(Date fechaRecepcion) {
		this.fechaRecepcion = fechaRecepcion;
	}
	
	public List<ItemSolicitudCotizacion> getItemsSolicitud() {
		return itemsSolicitud;
	}
	
	public void setItemsSolicitud(List<ItemSolicitudCotizacion> itemsSolicitud) {
		this.itemsSolicitud = itemsSolicitud;
	}
	
	public boolean isCotizada() {
		return cotizada;
	}
	
	public void setCotizada(boolean cotizada) {
		this.cotizada = cotizada;
	}
	
	public void agregarItem(String codigo, String sufijo, String paisOrigen, String fabricante, Integer cantidad)
	{
		ItemSolicitudCotizacion item = new ItemSolicitudCotizacion(this, codigo, sufijo, paisOrigen, fabricante, cantidad);
		
		if (!itemsSolicitud.contains(item))
		{
			itemsSolicitud.add(item);
		}
	}
	
	public void eliminarItem(String codigo, String sufijo, String paisOrigen, String fabricante)
	{
		ItemSolicitudCotizacion item = new ItemSolicitudCotizacion(this, codigo, sufijo, paisOrigen, fabricante, null);
		
		if (itemsSolicitud.contains(item))
		{
			itemsSolicitud.remove(item);
		}
	}
	
	@Override
	public int hashCode() {
		final int primo = 31;
		int result = 1;
		result = primo * (result + (numeroSolicitud == null ? 0 : numeroSolicitud.hashCode()) 
				+ (cliente == null ? 0 : cliente.hashCode()) );
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;	
		if ((obj == null) || (!(obj instanceof SolicitudCotizacion))) {
			return false;
		}
		
		SolicitudCotizacion otro = (SolicitudCotizacion) obj;
		
		boolean mismoCliente = (cliente!=null && otro.cliente != null ? (cliente.equals(otro.cliente)) : false);
		boolean mismoNumero = (numeroSolicitud!=null && otro.numeroSolicitud != null ? (numeroSolicitud.equals(otro.numeroSolicitud)) : false);
		
		return mismoCliente && mismoNumero;
	}
}
